package com.sheng.leetcode.year2025.month09.day23;

import org.junit.Test;

/**
 * @author by ls
 * @date 2025/9/23
 * <p>
 * 165. 比较版本号 <p>
 * <p>
 * 给你两个 版本号字符串 version1 和 version2 ，请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。 <p>
 * 比较版本号时，请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少，则将缺失的修订号视为 0。 <p>
 * 返回规则如下： <p>
 * 如果 version1 < version2 返回 -1， <p>
 * 如果 version1 > version2 返回 1， <p>
 * 除此之外返回 0。 <p>
 * <p>
 * 示例 1： <p>
 * 输入：version1 = "1.2", version2 = "1.10" <p>
 * 输出：-1 <p>
 * 解释： <p>
 * version1 的第二个修订号为 "2"，version2 的第二个修订号为 "10"：2 < 10，所以 version1 < version2。 <p>
 * <p>
 * 示例 2： <p>
 * 输入：version1 = "1.01", version2 = "1.001" <p>
 * 输出：0 <p>
 * 解释： <p>
 * 忽略前导零，"01" 和 "001" 都代表相同的整数 "1"。 <p>
 * <p>
 * 示例 3： <p>
 * 输入：version1 = "1.0", version2 = "1.0.0.0" <p>
 * 输出：0 <p>
 * 解释： <p>
 * version1 有更少的修订号，每个缺失的修订号按 "0" 处理。 <p>
 * <p>
 * 提示： <p>
 * 1 <= version1.length, version2.length <= 500 <p>
 * version1 和 version2 仅包含数字和 '.' <p>
 * version1 和 version2 都是 有效版本号 <p>
 * version1 和 version2 的所有修订号都可以存储在 32 位整数 中 <p>
 */
public class LeetCode0165 {

    @Test
    public void test() {
//        String version1 = "1.2", version2 = "1.10";
//        String version1 = "1.01", version2 = "1.001";
//        String version1 = "1.0", version2 = "1.0.0.0";
        String version1 = "19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.00.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000",
                version2 = "19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000";
        System.out.println(new Solution().compareVersion(version1, version2));
    }
}

class Solution {
    public int compareVersion(String version1, String version2) {
        // 分割字符串
        String[] split1 = version1.split("\\.");
        String[] split2 = version2.split("\\.");
        for (int i = 0, j = 0; i < split1.length && j < split2.length; i++, j++) {
            Integer i1 = Integer.valueOf(split1[i]);
            Integer ij = Integer.valueOf(split2[j]);
            // 从左到右，根据分割后的数字大小，忽略前导零进行比较
            int compareTo = i1 - ij;
            if (compareTo > 0) {
                return 1;
            } else if (compareTo < 0) {
                return -1;
            }
        }
        if (split1.length == split2.length) {
            // 数组长度相等时
            return 0;
        } else if (split1.length > split2.length) {
            // 不相等时，获取长度更长的一方数组，如果剩余全是 0，那么一样相等，否则长的数组版本高
            for (int i = split2.length; i < split1.length; i++) {
                Integer i1 = Integer.valueOf(split1[i]);
                if (i1 != 0) {
                    return 1;
                }
            }
        } else {
            for (int i = split1.length; i < split2.length; i++) {
                Integer i2 = Integer.valueOf(split2[i]);
                if (i2 != 0) {
                    return -1;
                }
            }
        }
        // 默认返回 0
        return 0;
    }
}
